#include "gather_task.h"
#include "stdio.h"  // 标准输入输出（用于调试打印）

TaskHandle_t gatherHandler;  // 采集任务句柄

/**
 *  采集模块初始化
 * 
 * 初始化所有传感器硬件：
 * 1. DHT11温湿度传感器
 * 2. ADC模块（用于光照和烟雾检测）
 * 3. 雨水检测模块
 */
void init_gather() {
    // 初始化温湿度传感器
    DHT11_Init();
    
    // 初始化ADC（模数转换器）
    ADCx_Init();
    
    // 初始化雨水检测模块
    rainInit();
}

/**
 *  数据采集任务主函数
 * 
 * 每2秒执行一次传感器数据采集：
 * 1. 读取温湿度数据
 * 2. 读取光照强度
 * 3. 读取烟雾浓度
 * 4. 检测雨水状态
 * 5. 将原始数据发送给数据处理模块
 * 
 * @param param 任务参数（未使用）
 */
void gather_task(void *param) {
    u16 value;  // 临时存储ADC转换值
    
    while (1) {
        // 创建临时数据结构存储原始传感器数据
        GatherData source;
        
        /*
         * 调试代码示例（已被注释）：
         * 这段代码展示了如何读取并打印各个传感器的原始值
         * 在实际运行中不使用，但保留作为调试参考
         *
         * u8 temp, humi;
         * DHT11_Read_Data(&temp, &humi);
         * printf("温湿度数据: %d℃, %d%% \r\n", temp, humi);
         *
         * value = Get_ADC_Value(ADC_Channel_9, 1);
         * printf("光照ADC原始值: %d\r\n", value);
         * value = 100 - value/40;  // 转换为百分比
         * if(value >= 100) value = 100;
         * printf("光照强度: %d%% \r\n", value);
         *
         * value = Get_ADC_Value(ADC_Channel_8, 1);
         * printf("烟雾ADC原始值: %d\r\n", value);
         * value = value/40;  // 转换为百分比
         * if(value >= 100) value = 100;
         * printf("烟雾浓度: %d%% \r\n", value);
         *
         * printf("雨水状态: %d \r\n", DATA_PIN_READ);
         */

        // === 实际采集流程 ===
        
        // 1. 获取温湿度数据（单位：℃和%）
        DHT11_Read_Data(&source.temp, &source.humi);
        
        // 2. 获取光照强度（ADC通道9，12位分辨率值0-4095）
        source.sunshine = Get_ADC_Value(ADC_Channel_9, 1);
        
        // 3. 获取烟雾浓度（ADC通道8，12位分辨率值0-4095）
        source.smoke = Get_ADC_Value(ADC_Channel_8, 1);
        
        // 4. 检测雨水状态（0=有雨水，1=无雨水）
        // 注意：DATA_PIN_READ为0表示检测到雨水
        source.raidrop = (DATA_PIN_READ == 0) ? 0 : 1;
        
        // 5. 将原始数据发送给数据处理模块进行加工
        dataHandler(&source);
        
        // 延时2秒（2000个RTOS tick）后进行下一次采集
        vTaskDelay(2000);
    }
}

/**
 *  创建数据采集任务
 * 
 * 初始化采集任务：
 * - 任务名称: "gather_task"
 * - 栈大小: 128字（足够存储局部变量和函数调用）
 * - 优先级: 2（中等优先级）
 */
void createGatherTask() {
    xTaskCreate(
        gather_task,       // 任务主函数
        "gather_task",     // 任务名称
        128,               // 栈大小
        NULL,              // 任务参数
        2,                // 任务优先级
        &gatherHandler     // 任务句柄存储位置
    );
}